<?php
// +----------------------------------------------------------------------
// | 全局公共函数定义
// +----------------------------------------------------------------------
// | Author: liang 辰风沐阳 23426945@qq.com Blog: https://www.itqaq.com
// +----------------------------------------------------------------------

use liang\MicroEngine;

/**
 * 操作成功
 *
 * @param string $msg
 * @param string $name
 */
function success(string $msg = "操作成功", $state = 'success')
{
    $code = config('code.' . $state);
    return json(compact('code', 'msg'));
}

/**
 * 操作失败、有错误发生
 *
 * @param string  $msg
 * @param integer $code
 */
function fault(string $msg = "", $state = 'fault')
{
    $code = config('code.' . $state);
    throw new \Exception($msg, $code);
}

/**
 * 返回数据
 *
 * @param array   $data
 * @param string  $msg
 * @param mixed   $code
 */
function data(array $data, string $msg = "获取成功", $state = 'success')
{
    $code = config('code.' . $state);
    return json(compact('code', 'msg', 'data'));
}

// +----------------------------------------------------------------------
// | 数据格式转换
// +----------------------------------------------------------------------

/**
 * 模型搜索器参数构造函数
 *
 * @param array $keys
 * @param array $where
 */
function where_filter(&$keys, array $where)
{
    // 去掉数组里的空字符串和null
    $where = array_filter($where, function ($k) {
        return ($k === '' || $k === null) ? false : true;
    });
    // 拿到所有键
    $keys = array_keys($where);
    // 返回数组
    return $where;
}

/**
 * 对数据进行json_encode编码并且中文不转码
 */
function encode($data)
{
    return json_encode($data, JSON_UNESCAPED_UNICODE);
}

/**
 * 将数组数据转为查询字符串
 */
function queryString($data)
{
    $link = '';
    foreach ($data as $key => $value) {
        $link .= $key . '=' . trim($value) . '&';
    }
    return rtrim($link, '&');
}

/**
 * 查询字符串转为数组
 * 
 * @param string $params
 */
function queryStringToArray(string $params)
{
    $data = []; // 附加参数
    $array = explode('&', $params);
    foreach ($array as $value) {
        $temp = explode('=', $value);
        $data[$temp[0]] = $temp[1];
    }
    return $data;
}

// +----------------------------------------------------------------------
// | 数据格式化
// +----------------------------------------------------------------------

/**
 * 将时间戳格式化为日期时间
 *
 * @param $timestamp
 * @param $format
 */
function formatTime($timestamp, $format = 'Y-m-d H:i:s')
{
    return $timestamp ? date($format, $timestamp) : '';
}

/**
 * 格式化金额
 */
function formatMoney($money)
{
    return floatval(sprintf('%.2f', $money));
}

// +----------------------------------------------------------------------
// | 其他函数
// +----------------------------------------------------------------------

/**
 * 给小程序前端提供图片
 */
function appletImg($img)
{
    if (MicroEngine::isMicroEngine()) {
        $mobule = MicroEngine::getModuleName();
        return request()->domain() . "/addons/{$mobule}/public/wxapp/" . $img;
    } else {
        return request()->domain() . "/wxapp/{$img}";
    }
}

/**
 * 推送消息队列任务
 *
 * @param string  $class
 * @param string  $action
 * @param array   $data
 * @param integer $delay
 */
function addQueue(string $class, string $action, array $data, int $delay = 0)
{
    $job = implode('@', [$class, $action]);
    queue($job, $data, $delay, MicroEngine::getModuleName());
}

/**
 * 写入日志
 *
 * @param ...$params
 */
function writeLog(...$params)
{
    \think\facade\Log::write(...$params);
}

// +-----------------------------------------------------------
// | 兼容独立版、微擎版路由地址 (后台混编时使用)
// +-----------------------------------------------------------

/**
 * 兼容微擎版、独立版
 * 
 * 前后台应用微擎路由通用生成方法
 * 
 * @author  liang
 * @example u('index')
 * @example u('user/login', ['id' => 1])
 * @example u('merchType/getLists', ['id' => 2])
 * 
 */
function u(...$param): string
{
    // 判断当前是否在微擎框架中
    if (MicroEngine::isMicroEngine()) {
        // 应用 模块 方法
        $contro = request()->controller();
        // 微擎框架自带参数
        $weParam = request()->only(['i', 'c', 'a', 'eid', 'version_id', 'do', 'm'], 'get');
        // 路由参数
        $route = explode('/', $param[0] ?? ''); // ?? 处理编辑器报红
        // parse_name 控制器驼峰命名转为下划线分隔命名
        switch (count($route)) {
            case 1: // u('index')
                $path = ['', parse_name($contro), $route[0]];
                break;
            case 2: // u('index/index')
                $path = ['', parse_name($route[0]), $route[1]];
                break;
        }
        $s = implode('/', $path);
        $url = request()->domain() . request()->baseFile() . '?' . queryString($weParam) . '&s=' . $s;
        if (!empty($param[1])) $url .= '&' . queryString($param[1]);
        return $url;
    } else {
        // 独立版
        $contro = request()->controller();
        $route = explode('/', $param[0] ?? '');
        switch (count($route)) {
            case 1: // u('index')
                $path = ['', parse_name($contro), $route[0]];
                break;
            case 2: // u('index/index')
                $path = ['', parse_name($route[0]), $route[1]];
                break;
        }
        $s = implode('/', $path);
        $param[0] = $s;
        return request()->domain() . url(...$param);
    }
}
